/* 
 * File:   Partida.cpp
 * Author: 75.02 - Grupo 7, 2do cuatrimestre 2012.
 * 
 * Created on November 2, 2012, 12:19 PM
 */

#include "Partida.h"
#include "Jugador.h"
using namespace TP::Juego;

Partida::Partida(){}

Partida::Partida(const string& pNombre, Escenario* pEscenario, Jugador* pJugador) {
    this->_jugadorAdm = pJugador;
    this->_jugadores.push_back(pJugador);
    this->_nombre = pNombre;
    this->_arenaJuego = pEscenario;
}

Partida::~Partida() {
}

Escenario* Partida::ArenaJuego (){
    return this->_arenaJuego;
}

string Partida::aXML(){

    TiXmlDocument* doc = new TiXmlDocument();
    TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
    doc->LinkEndChild( decl );
    
    doc->LinkEndChild(this->aElementoXML());

    TiXmlPrinter printer;
    doc->Accept(&printer);
    return printer.CStr();    
}

string Partida::aXML(const string& pPath){

    TiXmlDocument* doc = new TiXmlDocument(pPath.c_str());
    TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
    doc->LinkEndChild( decl );
    
    doc->LinkEndChild(this->aElementoXML());
    
    TiXmlPrinter printer;
    doc->Accept(&printer);
    return printer.CStr();    
}

void Partida::parseXML (const string& pDescriptor){

    TiXmlDocument doc;
    doc.Parse(pDescriptor.c_str(), 0, TIXML_ENCODING_UTF8);
    this->deElementoXML(doc.FirstChildElement());
}

TiXmlElement* Partida::aElementoXML (){
    
    TiXmlElement* elementPartida = new TiXmlElement("Partida");
    
    elementPartida->SetAttribute("nombre", this->_nombre.c_str());
    
    // Serializo la arena de juego.
    elementPartida->LinkEndChild(this->_arenaJuego->aElementoXML());
    
    // Serializo los jugadores.
    TiXmlElement* element = new TiXmlElement("Jugadores");
    
    for (int cur = 0; cur < this->_jugadores.size(); cur++)
        element->LinkEndChild(this->_jugadores[cur]->aElementoXML());
    
    elementPartida->LinkEndChild(element);
           
    return elementPartida;
}

void Partida::deElementoXML (TiXmlElement* pElemento){

    if (strcmp (pElemento->Value(), "Partida") == 0)
    {
        this->_nombre = pElemento->Attribute("nombre");
        
        // Hidrato la arena de juego.
        this->_arenaJuego = new Escenario();
        this->_arenaJuego->deElementoXML(pElemento->FirstChildElement());
        
        // Hidrato los jugadores.
        
        TiXmlElement* elemento = pElemento->FirstChildElement()->NextSiblingElement()->FirstChildElement();
        while (NULL != elemento)
        {
            Jugador* jugador = new Jugador();
            jugador->deElementoXML(elemento);
            this->_jugadores.push_back(jugador);
            
            elemento = elemento->NextSiblingElement();
        }
    }
}

vector<Jugador*>& Partida::getJugadores(){
    return this->_jugadores;
}

Partida* Partida::crearDeXML (const string& pDescriptor) throw (Excepcion&) {

    TiXmlDocument doc;
    doc.Parse(pDescriptor.c_str(), 0, TIXML_ENCODING_UTF8);
    
    if (strcmp (doc.FirstChildElement()->Value(), "Partida") != 0)
        throw Excepcion ("El descriptor no corresponde a una clase Partida.");

    Partida* partida = new Partida();
    partida->deElementoXML(doc.FirstChildElement());
    return partida;
}

const string& Partida::getNombre(){
    return this->_nombre;
}